#include "project/initialization.h"

void
interactKeyboard(unsigned char key, int x, int y)
{
	switch(key)
	{
		/* Finaliza a execucao do programa */
		case 27:
			printf("%s: Sinal de saida detectado!\n", window_title);
			exit(0);
			break;

		/* Ativa o modelo 1 */
		case '1':
			setActiveModel(1);
			printf("%s: Modelo ativo: 1\n", window_title);
			break;

		/* Ativa o modelo 2 */
		case '2':
			setActiveModel(2);
			printf("%s: Modelo ativo: 2\n", window_title);
			break;

		/* Desloca positivamente a camera em relacao ao eixo Z */
		case '+':
			eyeZ -= 0.2;
			printf("eyeZ: %f\n", eyeZ);
			break;

		/* Desloca negativamente a camera em relacao ao eixo Z */
		case '-':
			eyeZ += 0.2;
			printf("eyeZ: %f\n", eyeZ);
			break;

		/* Habilita a matriz de projecao 'perspectiva' */
		case 'p':
			projection = 0;
			printf("%s: Projecao selecionada: Perspectiva\n", window_title);
			break;

		/* Habilita a matriz de projecao 'frustum' */
		case 'f':
			projection = 1;
			printf("%s: Projecao selecionada: Frustum\n", window_title);
			break;

		/* Habilita a matriz de projecao 'ortogonal' */
		case 'o':
			projection = 2;
			printf("%s: Projecao selecionada: Ortogonal\n", window_title);
			break;

		default:
			break;
	}
	glutPostRedisplay();
}

void
interactMouse(int button, int state, int x, int y)
{
	/* Rotaciona o modelo sobre o eixo X (ver funcao 'glutMotionFunc') */
	if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
	{
		printf("%s: Rotacao selecionada: Eixo X\n", window_title);

		/* Armazena coordenada X inicial (pixels em relacao ao canto superior esquerdo) */
		old_mouse_x = x;

		/* Define o vetor unitario na direcao do eixo X como o vetor de giro */
		active_ply->rt_offset->x_axis = 0.0f;
		active_ply->rt_offset->y_axis = 1.0f;
	}

	/* Rotaciona o modelo sobre o eixo Y (ver funcao 'glutMotionFunc') */
	if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
	{
		printf("%s: Rotacao selecionada: Eixo Y\n", window_title);

		/* Armazena coordenada Y inicial (pixels em relacao ao canto superior esquerdo) */
		old_mouse_y = y;

		/* Define o vetor unitario na direcao do eixo Y como o vetor de giro */
		active_ply->rt_offset->x_axis = 1.0f;
		active_ply->rt_offset->y_axis = 0.0f;
	}

	/* Translada o modelo ativo no sentido negativo do eixo Z */
	if (button == 3)
	{
		printf("%s: Translacao selecionada: Eixo Z\n", window_title);
		active_ply->tr_offset->z_tr -= 0.01;
	}

	/* Translada o modelo ativo no sentido postivo do eixo Z */
	if (button == 4)
	{
		printf("%s: Translacao selecionada: Eixo Z\n", window_title);
		active_ply->tr_offset->z_tr += 0.01;
	}

	/* Configura FLAG interna ao OpenGL requisitando reexecucao da CALLBACK display */
	glutPostRedisplay();			
}

void
interactMotion(int x, int y)
{
	/* Variacoes das coordenadas X e Y */
	int delta_x = x - old_mouse_x;	
	int delta_y = y - old_mouse_y;

	if ( delta_x > 0 && active_ply->rt_offset->y_axis == 1.0f) // Se a variacao e positiva e o botao pressionado for o esquerdo, o mouse esta movendo para a direita
		active_ply->rt_offset->angle += angle_step;
	else if ( delta_x < 0 && active_ply->rt_offset->y_axis == 1.0f) // Se a variacao e negativa e o botao pressionado for o esquerdo, o mouse esta movendo para a esquerda
		active_ply->rt_offset->angle -= angle_step;

	if ( delta_y > 0 && active_ply->rt_offset->x_axis == 1.0f) // Se a variacao e positiva e o botao pressionado for o direto, o mouse esta movendo para baixo
		active_ply->rt_offset->angle += angle_step;
	else if ( delta_y < 0 && active_ply->rt_offset->x_axis == 1.0f) // Se a variacao e negativa e o botao pressionado for o direito, o mouse esta movendo para cima
		active_ply->rt_offset->angle -= angle_step;

	/* Atualiza (em relacao ao novo ponto) os novos valores das variaveis 'old_mouse_<X|Y>' */
	old_mouse_x = x;
	old_mouse_y = y;

	/* Configura FLAG interna ao OpenGL requisitando reexecucao da CALLBACK display */
	glutPostRedisplay();
}

